from werkzeug.utils import secure_filename
import os
from utils.time_utils import TimeUtils
from utils.sql_utils import SQLManager
from utils.id_utils import IdUtils
from flask import current_app, jsonify
from minio.error import S3Error


# 允许上传的文件类型
ALLOWED_EXTENSIONS = {'jpg', 'jpeg', 'png'}

# 上传文件的基础路径
BASE_PATH = '/Users/liuhanzhong/PycharmProjects/RedBK/fontCode/vue-redbk-master/static/upload_imgs'

# 检查文件扩展名是否合法
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# 获取文件后缀名
def get_file_back_suffix(filename):
    return filename.rsplit('.', 1)[1].lower()

BUCKET_NAME = 'gh-rbk'

class OssService:
    """
        本地文件上传本地
    """
    @staticmethod
    def aliyun_upload_file(files):
        """
        接收前端传递的文件（单个或多个）并直接上传到 MinIO
        :param files: 单个文件对象或文件对象列表
        :return: 返回文件在 MinIO 中的访问 URL 列表或单个 URL
        """
        # 使用全局的 MinIO 客户端
        minio_client = current_app.minio
        
        # 如果传入的是单个文件，转换为列表方便统一处理
        if not isinstance(files, list):
            files = [files]
        
        file_urls = []
        for file in files:
            # 生成唯一的文件名
            file_suffix = get_file_back_suffix(file.filename)
            unique_filename = f"{IdUtils.generate_id()}.{file_suffix}"
            try:
                # 直接上传文件到 MinIO，无需保存到本地
                minio_client.put_object(
                    BUCKET_NAME,
                    unique_filename,
                    file,
                    length=-1,  # 自动计算长度
                    part_size=10*1024*1024,
                    content_type=file.content_type,
                    metadata={"x-amz-acl": "public-read"}
                )
                file_url = f"http://117.72.37.61:9000/gh-rbk/{unique_filename}"
                file_urls.append(file_url)
            except S3Error as e:
                return {"error": f"文件上传失败: {e}"}
        
        # 如果只有一个文件，返回单个 URL
        if len(file_urls) == 1:
            return {"file_url": file_urls[0]}
        # 如果多个文件，返回 URLs 列表
        return {"file_urls": file_urls}


    # def upload_file(self, file, upload_path=BASE_PATH):
    #     """
    #     上传文件并返回文件 URL
    #     :param file: 文件对象
    #     :param upload_path: 文件上传路径（可选）
    #     :return: 文件访问 URL
    #     """
    #     if not file:
    #         raise ValueError("No file provided")
        
    #     if not allowed_file(file.filename):
    #         raise ValueError("File type not allowed")
        
    #     # 确保上传目录存在
    #     os.makedirs(upload_path, exist_ok=True)
        
    #     # 生成唯一的文件名
    #     file_suffix = get_file_back_suffix(file.filename)
    #     unique_filename = f"{IdUtils.generate_id()}.{file_suffix}"
        
    #     # 文件保存路径
    #     file_path = os.path.join(upload_path, unique_filename)
        
    #     # 保存文件
    #     file.save(file_path)
        
    #     # 返回文件访问地址
    #     file_url = f"static/upload_imgs/{unique_filename}"
    #     return file_url
    